package com.david.learning.generic;

import java.util.List;
import java.util.ArrayList;

/**
 * 
 * 在代码中避免泛型类和原始类型的混用。比如List<String>和List不应该共同使用。
 * 在使用带通配符的泛型类的时候，需要明确通配符所代表的一组类型的概念。由于具体的类型是未知的，很多操作是不允许的。
 * 泛型类最好不要同数组一块使用。你只能创建new List<?>[10]这样的数组，无法创建new List<String>[10]这样的。
 * 这限制了数组的使用能力，而且会带来很多费解的问题。因此，当需要类似数组的功能时候，使用集合类即可。
 * 类型参数并不能用来创建对象或是作为静态变量的类型。
 */
public class Canvas {
    public static void main(String[] args) {
	// Next line can't use List<? extends Shape>
	List<Shape> shapeList = new ArrayList<Shape>();
	shapeList.add(new Circle());
	shapeList.add(new Rectangle());
	shapeList.add(new Circle());
	Canvas c = new Canvas();
	// c.drawAll(shapeList);

	c.draw2shapes(shapeList);

    }

    public void drawAll(List<Shape> shapes) {
	for (Shape s : shapes) {
	    s.draw(this);
	}
    }

    public <T extends Shape> void draw2shapes(List<T> shapes) {
	for (Shape s : shapes) {
	    s.draw(this);
	}
    }

}